package com.base.common.model.response;


import com.base.common.model.request.CommonRequest;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;

/**
 * 响应对象信息
 *
 * @author admin
 * @date 2020/5/12 PM2:11
 **/
@ApiModel(value = "CommonResponseHeader", description = "响应对象信息")
public abstract class CommonResponse extends CommonRequest implements java.io.Serializable {
    /**
     * @Fields serialVersionUID : 序列化标识
     */
    private static final long serialVersionUID = 7148230714660037747L;

    /**
     * <p>应答方方交易流水</p>
     * <p>需要明确交易流水规则</p>
     */
    @ApiModelProperty(notes = "应答方方交易流水")
    private String respTransID;

    /**
     * <p>处理结果代码</p>
     * 取值描述：
     * 0 - 无任何问题，业务交互成功；
     * 1 - 接收成功，业务处理发生未知错误；
     * ……其他取值参照具体接口错误描述。
     */
    @ApiModelProperty(notes = "处理结果代码: 0 - 无任何问题，业务交互成功；1 - 接收成功，业务处理发生未知错误；")
    private String respCode;

    /**
     * <p>处理结果代码描述，当respCode=0时，respMsg=success，其他情况返回描述信息，用于系统提示</p>
     */
    @ApiModelProperty(notes = "处理结果代码描述，当respCode=0时，respMsg=success，其他情况返回描述信息，用于系统提示")
    private String respMsg;

    /**
     * <p>应答时间，格式：yyyyMMddHHmmssSSS</p>
     * 字段取发送请求是操作系统当前时间
     */
    @ApiModelProperty(notes = "应答时间，格式：yyyyMMddHHmmssSSS")
    private String respTime;

    /**
     * <p>应答数据是否需要验签，当取值为1时需要对reqSign进行签名验证</p>
     * 取值描述：
     * 0 - 不需要 ；
     * 1 - 需要；
     */
    @ApiModelProperty(notes = "应答数据是否需要验签")
    private String respSignFlag;

    /**
     * 应答数字签名，当reqSignFlag=1时，该字段存在取值
     */
    @ApiModelProperty(notes = "应答数字签名")
    private String respSign;

    /**
     * <p>Title: 构造函数</p>
     * <p>Description: 同时对actionCode、respSignFlag和respCode进行初始化，其中respCode初始化取值为失败状态</p>
     */
    public CommonResponse() {
        this.setRespSignFlag(SIGN_NO);
        this.setRespCode(STATUS_FAILURE);
    }

    /**
     * <p>Title: 构造函数</p>
     * <p>Description: 通过request对象构造，同时将request中的头信息进行填充，并且对actionCode、respSignFlag和respCode进行初始化，其中respCode初始化取值为失败状态</p>
     *
     * @param request 请求对象
     */
    public CommonResponse(CommonResponse request) {
        this.setReqTime(request.getReqTime());
        this.setReqTransID(request.getReqTransID());
        this.setActionCode(ACTION_RESPONSE);
        this.setRespSignFlag(SIGN_NO);
        this.setRespCode(STATUS_FAILURE);
        this.setRespMsg("ERROR");
    }

    public String getRespTransID() {
        return respTransID;
    }

    public CommonResponse setRespTransID(String respTransID) {
        this.respTransID = respTransID;
        return this;
    }

    public String getRespCode() {
        return respCode;
    }

    public CommonResponse setRespCode(String respCode) {
        this.respCode = respCode;
        return this;
    }

    public CommonResponse setSuccessRespCode() {
        this.respCode = STATUS_SUCCESS;
        return this;
    }

    public CommonResponse setFailureRespCode() {
        this.respCode = STATUS_FAILURE;
        return this;
    }

    public String getRespMsg() {
        return respMsg;
    }

    public CommonResponse setRespMsg(String respMsg) {
        this.respMsg = respMsg;
        return this;
    }

    public String getRespTime() {
        return respTime;
    }

    public CommonResponse setRespTime(String respTime) {
        this.respTime = respTime;
        return this;
    }

    public CommonResponse setCurrentRespTime() {
        this.respTime = String.valueOf(System.currentTimeMillis());
        return this;
    }

    public String getRespSignFlag() {
        return respSignFlag;
    }

    public CommonResponse setRespSignFlag(String respSignFlag) {
        this.respSignFlag = respSignFlag;
        return this;
    }

    public String getRespSign() {
        return respSign;
    }

    public CommonResponse setRespSign(String respSign) {
        this.respSign = respSign;
        return this;
    }

    /**
     * <p>Title: setSuccess</p>
     * <p>Description: 设置响应成功状态 </p>
     *
     * @param msg 成功提示信息
     * @return 当前响应对象
     */
    public CommonResponse setSuccess(String msg) {
        this.setRespCode(STATUS_SUCCESS);
        this.setRespMsg(msg);
        return this;
    }

    /**
     * <p>Title: setSuccess</p>
     * <p>Description: 设置响应成功状态，提示信息使用：SUCCESS</p>
     *
     * @return 当前响应对象
     */
    public CommonResponse setSuccess() {
        return this.setSuccess("SUCCESS");
    }

    /**
     * <p>Title: setSuccessWithRespTime</p>
     * <p>Description: 设置响应成功状态，并同时设置响应时间，取当前系统时间</p>
     *
     * @return 当前响应对象
     */
    public CommonResponse setSuccessWithRespTime() {
        return setCurrentRespTime().setSuccess();
    }

    /**
     * <p>Title: setSuccessWithRespTime</p>
     * <p>Description: 设置响应成功状态，并同时设置响应时间，响应时间取当前系统时间</p>
     *
     * @param msg 成功提示信息
     * @return 当前响应对象
     */
    public CommonResponse setSuccessWithRespTime(String msg) {
        return setCurrentRespTime().setSuccess(msg);
    }

    /**
     * <p>Title: setSuccessWithRespTimeAndTransId</p>
     * <p>Description: 设置响应成功状态，并同时设置响应时间与应答方流水，响应时间取当前系统时间</p>
     *
     * @param transId 应答方交易流水
     * @return 当前响应对象
     */
    public CommonResponse setSuccessWithRespTimeAndTransId(String transId) {
        return setSuccessWithRespTime().setRespTransID(transId);
    }

    /**
     * <p>Title: setSuccessWithRespTimeAndTransId</p>
     * <p>Description: 设置响应成功状态，并同时设置响应时间与应答方流水，响应时间取当前系统时间 </p>
     *
     * @param transId 应答方流水
     * @param msg     成功提示信息
     * @return 当前响应对象
     */
    public CommonResponse setSuccessWithRespTimeAndTransId(String transId, String msg) {
        return setSuccessWithRespTime(msg).setRespTransID(transId);
    }

    /**
     * <p>Title: setFailure</p>
     * <p>Description: 设置响应失败状态</p>
     *
     * @param code 状态码
     * @param msg  错误提示信息
     * @return 当前响应对象
     */
    public CommonResponse setFailure(String code, String msg) {
        if (STATUS_SUCCESS.equals(code)) {
            throw new IllegalArgumentException("不能使用成功状态码");
        }
        this.setRespCode(code);
        this.setRespMsg(msg);
        return this;
    }

    /**
     * <p>Title: setFailure</p>
     * <p>Description: 设置响应失败状态，响应码使用：Header.STATUS_FAILURE</p>
     *
     * @param msg 错误信息
     * @return 当前响应对象
     */
    public CommonResponse setFailure(String msg) {
        return this.setFailure(STATUS_FAILURE, msg);
    }

    /**
     * <p>Title: setFailureWithRespTime</p>
     * <p>Description: 设置失败响应状态，并同时设置响应时间，响应时间取当前系统时间</p>
     *
     * @param msg 失败提示信息
     * @return 当前响应对象
     */
    public CommonResponse setFailureWithRespTime(String msg) {
        return this.setCurrentRespTime().setFailure(msg);
    }

    /**
     * <p>Title: setFailureWithRespTimeAndTransId</p>
     * <p>Description: 设置失败响应状态，并同时设置响应时间和应答方流水，响应时间取当前系统时间</p>
     *
     * @param transId 应答方流水
     * @param msg     失败提示信息
     * @return 当前响应对象
     */
    public CommonResponse setFailureWithRespTimeAndTransId(String transId, String msg) {
        return this.setCurrentRespTime().setFailure(msg).setRespTransID(transId);
    }
}